package l_fanshe;

import java.lang.reflect.Field;

/* 
 * 获取成员变量并调用： 
 *  
 * 1.批量的 
 *      1).Field[] getFields():获取所有的"公有字段" 
 *      2).Field[] getDeclaredFields():获取所有字段，包括：私有、受保护、默认、公有； 
 * 2.获取单个的： 
 *      1).public Field getField(String fieldName):获取某个"公有的"字段； 
 *      2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的) 
 *  
 *   设置字段的值： 
 *      Field --> public void set(Object obj,Object value): 
 *                  参数说明： 
 *                  1.obj:要设置的字段所在的对象； 
 *                  2.value:要为字段设置的值； 
 *  
 */  
public class Fields {
	
	public static void main(String[] args) throws Exception {
		//1.获取Class对象
		Class<?> stuClass = Class.forName("l_fanshe.Student");
		//2.获取字段
		System.out.println("*******************获取所有公有的字段*******************");
		Field[] fieldArray = stuClass.getFields();
		for (Field f : fieldArray) {
			System.out.println(f);
		}
		
		System.out.println("*******************获取的字段(包括私有,受保护,默认)*******************");
		fieldArray = stuClass.getDeclaredFields();
		for (Field f : fieldArray) {
			System.out.println(f);
		}
		
		System.out.println("*******************获取公有的字段**并调用*******************");
		Field f = stuClass.getField("name");
		System.out.println(f);
		//获取一个对象
		Object obj = stuClass.getConstructor().newInstance();//产生Student2对象 -->Student2 stu = new Student2();
		//为字段设置值
		f.set(obj, "刘德华");//为Student2对象中的name属性赋值-->stu.name = "刘德华"
		//验证
		Student stu = (Student)obj;
		System.out.println("验证姓名:" + stu.name);
		
		System.out.println("*******************获取私有的字段**并调用*******************");
		f = stuClass.getDeclaredField("phoneNum");
		System.out.println(f);
		f.setAccessible(true);//暴力反射,接触私有限定
		f.set(obj, "188888888888888888888888");
		System.out.println("验证电话: " + stu.toString());
	}
	/*由此可见
	调用字段时：需要传递两个参数：
	Object obj = stuClass.getConstructor().newInstance();//产生Student对象--》Student stu = new Student();
	//为字段设置值
	f.set(obj, "刘德华");//为Student对象中的name属性赋值--》stu.name = "刘德华"
	第一个参数：要传入设置的对象，第二个参数：要传入实参*/
}
